/**
 * 2010(c) Copyright Oceansoft Information System Co.,LTD. All rights reserved.
 * <p>
 * Compile: JDK 1.6+
 * <p>
 * 版权所有(C)：江苏欧索软件有限公司
 * <p>
 * 公司名称：江苏欧索软件有限公司
 * <p>
 * 公司地址：中国苏州科技城青山路1号
 * <p>
 * 网址: http://www.oceansoft.com.cn
 * <p>
 * 作者: 090922(陈伟)
 * <p>
 * 文件名: com.oceansoft.mobile.econsole.common.util.ShortUrlGrenerator.java 
 * <p>
 * 类产生时间: 2014-5-16 下午 13:05
 * <p>
 * 负责人: 090922(陈伟)
 * <p>
 * Email:javacspring@gmail.com
 * <p>
 * 所在组 : 掌上公安应用平台
 * <p>
 * 所在部门: 开发部--手持技术部
 * <p>
 * <p>
 */
package cn.com.oceansoft.nos.common.util;

import java.security.MessageDigest;

/**
 * Description
 *
 * @author: chenw
 * @time: 2014-5-16 下午 13:05
 */
public class ShortUrlGrenerator {

    public static void main(String[] args) {
        String url = "com.oceansoft.mobile.econsole.modules.apps.controllergotoAppIndex";
        //        String url = "http://www.sunchis.com";
        StringBuilder sb = new StringBuilder(24);
        for (String string : ShortText(url)) {
            sb.append(string);
            print(string);
        }
        print(sb.toString());
    }

    public static String[] ShortText(String string) {
        String key = "oceansoft";//自定义生成MD5加密字符串前的混合KEY
        //要使用生成URL的字符
        String[] chars = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
        String hex = Encript.md5(key + string);
        int hexLen = hex.length();
        int subHexLen = hexLen / 8;
        String[] ShortStr = new String[4];
        for (int i = 0; i < subHexLen; i++) {
            String outChars = "";
            int j = i + 1;
            String subHex = hex.substring(i * 8, j * 8);
            long idx = Long.valueOf("3FFFFFFF", 16) & Long.valueOf(subHex, 16);
            for (int k = 0; k < 6; k++) {
                int index = (int) (Long.valueOf("0000003D", 16) & idx);
                outChars += chars[index];
                idx = idx >> 5;
            }
            ShortStr[i] = outChars;
        }
        return ShortStr;
    }

    private static void print(Object messagr) {
        System.out.println(messagr);
    }

    private static class Encript {
        //十六进制下数字到字符的映射数组
        private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};

        /**
         * 把inputString加密
         */
        public static String md5(String inputStr) {
            return encodeByMD5(inputStr);
        }

        /**
         * 验证输入的密码是否正确
         *
         * @param password    真正的密码（加密后的真密码）
         * @param inputString 输入的字符串
         * @return 验证结果，boolean类型
         */
        public static boolean authenticatePassword(String password, String inputString) {
            return password.equals(encodeByMD5(inputString));
        }

        /**
         * 对字符串进行MD5编码
         */
        private static String encodeByMD5(String originString) {
            if (originString != null) {
                try {
                    //创建具有指定算法名称的信息摘要
                    MessageDigest md5 = MessageDigest.getInstance("MD5");
                    //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
                    byte[] results = md5.digest(originString.getBytes());
                    //将得到的字节数组变成字符串返回
                    return byteArrayToHexString(results);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        /**
         * 轮换字节数组为十六进制字符串
         *
         * @param b 字节数组
         * @return 十六进制字符串
         */
        private static String byteArrayToHexString(byte[] b) {
            StringBuilder resultSb = new StringBuilder();
            for (byte aB : b) {
                resultSb.append(byteToHexString(aB));
            }
            return resultSb.toString();
        }

        //将一个字节转化成十六进制形式的字符串
        private static String byteToHexString(byte b) {
            int n = b;
            if (n < 0)
                n = 256 + n;
            int d1 = n / 16;
            int d2 = n % 16;
            return hexDigits[d1] + hexDigits[d2];
        }
    }
}
